home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Games Collection 1 / software vault.zip / software vault / CDR10 / XLIB06.ZIP / XLIBTL02 / XVIEW.C < prev    next >
C/C++ Source or Header  |  1993-03-26  |  6KB  |  230 lines

  1.  
  2. #include <stdio.h>
  3. #include <alloc.h>
  4. #include <mem.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <dir.h>
  8. #include <dos.h>
  9. #include "xlib_all.h"
  10. #define TITLE "XVIEW - Bitmap Display Utility (Xlib LBM/PBM/CBM formats)    T. Gouthas 20/11/92\n"
  11. #define SRC_EXT ".LBM"
  12. #define DEST_EXT ".CBM"
  13.  
  14. int convert(char *filenamein, char *filenameout);
  15. void syntax();
  16.  
  17. typedef struct _lbm_struc {
  18.   unsigned char width;
  19.   unsigned char height;
  20.   unsigned char data[];
  21. } far *LBM_PTR;
  22.  
  23. #define BUFF_LEN 100
  24.  
  25.    char drive[MAXDRIVE];
  26.    char dir[MAXDIR];
  27.    char name[MAXFILE];
  28.    char ext[MAXEXT];
  29.    char filenameraw[100];
  30.    char filenamewild[100];
  31.    char filenamein[100];
  32.    char filenameout[100];
  33.    struct ffblk ffb;
  34.    int bgcolor=0;
  35. size_t farfread(void far *destptr,size_t size, size_t n, FILE *fp){
  36.    unsigned len;
  37.    unsigned char buff[BUFF_LEN];
  38.    len=size*n;
  39.    while(len >=BUFF_LEN){
  40.      fread(buff,BUFF_LEN,1,fp);
  41.      movedata((unsigned)_DS,(unsigned)buff,FP_SEG(destptr),FP_OFF(destptr),BUFF_LEN);
  42.      len-=BUFF_LEN;
  43.      (char far *)destptr+=BUFF_LEN;
  44.    }
  45.    if (len>0){
  46.      fread(buff,len,1,fp);
  47.      movedata((unsigned)_DS,(unsigned)buff,FP_SEG(destptr),FP_OFF(destptr),len);
  48.    }
  49. };
  50.  
  51. size_t farfwrite(void far *srcptr,size_t size, size_t n, FILE *fp){
  52.    unsigned len;
  53.    unsigned char buff[BUFF_LEN];
  54.    len=size*n;
  55.    while(len >=BUFF_LEN){
  56.      movedata(FP_SEG(srcptr),FP_OFF(srcptr),(unsigned)_DS,(unsigned)buff,BUFF_LEN);
  57.      fwrite(buff,BUFF_LEN,1,fp);
  58.      len-=BUFF_LEN;
  59.      (char far *)srcptr+=BUFF_LEN;
  60.    }
  61.    if (len>0){
  62.      movedata(FP_SEG(srcptr),FP_OFF(srcptr),(unsigned)_DS,(unsigned)buff,len);
  63.      fwrite(buff,len,1,fp);
  64.    }
  65. };
  66.  
  67.  
  68. int drawfile(char *filenamein,char *ext){
  69.   static char far *ibuff=NULL, far *obuff=NULL;
  70.   static unsigned isize=0, osize=0;
  71.   unsigned width,height;
  72.   FILE *fi;
  73.   char far * farchptr;
  74.   unsigned infilesize,outfilesize;
  75.   fi=fopen(filenamein,"rb+");
  76.   if(!fi) return 0;
  77.   fseek(fi,0,SEEK_END);
  78.   infilesize = (unsigned) ftell(fi);
  79.   fseek(fi,0,SEEK_SET);
  80.   if (ibuff==NULL){
  81.     ibuff=farmalloc(infilesize);
  82.     if (ibuff==NULL) goto error;
  83.     isize=infilesize;
  84.   } else {
  85.     farchptr=farrealloc(ibuff,infilesize);
  86.     if (farchptr==NULL) goto error;
  87.     ibuff=farchptr;
  88.     isize=infilesize;
  89.   }
  90.   farfread(ibuff,infilesize,1,fi);
  91.   if ferror(fi) goto error;
  92.   if (!strcmp(ext,".CBM")){
  93.    x_put_cbitmap(0,10,0,ibuff);
  94.   } else if (!strcmp(ext,".PBM")){
  95.    x_put_pbm(0,10,0,ibuff);
  96.   } else if (!strcmp(ext,".LBM")){
  97.     if (obuff==NULL){
  98.       obuff=farmalloc(infilesize);
  99.       if (obuff==NULL) goto error;
  100.       osize=infilesize;
  101.     } else {
  102.       farchptr=farrealloc(obuff,infilesize);
  103.       if (farchptr==NULL) goto error;
  104.       obuff=farchptr;
  105.       osize=infilesize;
  106.     }
  107.     if(x_bm_to_pbm(ibuff,obuff)){
  108.       infilesize=x_sizeof_cbitmap(80,ibuff);
  109.       if (infilesize>osize){
  110.      farchptr=farrealloc(obuff,infilesize);
  111.      if (farchptr==NULL) goto error;
  112.      obuff=farchptr;
  113.      osize=infilesize;
  114.       }
  115.       x_compile_bitmap(80,ibuff,obuff);
  116.       x_put_cbitmap(0,10,0,obuff);
  117.     } else
  118.       x_put_pbm(0,10,0,obuff);
  119.   }
  120.  
  121.   fclose(fi);
  122.   return 1;
  123. error:
  124.   x_text_mode();
  125.   fclose(fi);
  126.   abort();
  127. }
  128.  
  129. char *intro[9]= {"XVIEW is a general purpose bitmap display utility. It can display \n",
  130.          "all the XLIB bitmap formats using a user specified palette and    \n",
  131.          "background colour if necessary. Multiple file specs that may      \n",
  132.          "include wild card characters can be supplied on the command line. \n",
  133.          NULL};
  134.  
  135.  
  136.  
  137. void syntax(){
  138.   int i;
  139.   printf("XVIEW [-w <log width>] [-p <palfile>] [-b <bgcolor>] <filespec> [ <filespec> ..] \n\n");
  140.   for(i=0;i<9 && intro[i];i++)
  141.     printf(intro[i]);
  142.   exit(0);
  143. }
  144.  
  145.  
  146. void loadpal(char *pal){
  147.   FILE *f;
  148.   unsigned infilesize;
  149.   char far *buff;
  150.   strupr(pal);
  151.   strcpy(filenamewild,pal);
  152.  
  153.  
  154.   fnsplit(filenamewild,drive,dir,NULL,ext);
  155.   if (*ext=='\0') strcat(filenamewild,".PAL");
  156.   if(findfirst(filenamewild,&ffb,0)){
  157.     return;
  158.   }
  159.   fnsplit(ffb.ff_name,NULL,NULL,name,ext);
  160.   fnmerge(filenamein,drive,dir,name,ext);
  161.   f=fopen(filenamein,"rb");
  162.   if (!f) return;
  163.   fseek(f,0,SEEK_END);
  164.   infilesize = (unsigned) ftell(f);
  165.   fseek(f,0,SEEK_SET);
  166.   if (infilesize < 768) return;
  167.   buff=farmalloc(infilesize);
  168.   if (buff==NULL) return;
  169.   farfread(buff,infilesize,1,f);
  170.   fclose(f);
  171.   x_put_pal_raw(buff,256,0);
  172.   farfree(buff);
  173. }
  174.  
  175. void main(int argc, char *argv[]){
  176.    int  i,w;
  177.    char *dotptr;
  178.    char *tempptr;
  179.  
  180.    printf(TITLE);
  181.    if (argc<2) syntax();
  182.  
  183.    /* initialize graphics */
  184.    x_set_mode(X_MODE_320x240,80);
  185.    x_text_init();
  186.    x_set_font(0);
  187.    for (i=1;i<argc;i++)
  188.      if (!strcmp(argv[i],"-w")){
  189.        if (argc > i+1){
  190.      i++;
  191.      sscanf(argv[i],"%d",&w);
  192.      x_text_mode();
  193.      x_set_mode(X_MODE_320x240,w);
  194.        }
  195.      } else if (!strcmp(argv[i],"-p")){
  196.        if (argc > i+1){
  197.      i++;
  198.      loadpal(argv[i]);
  199.        }
  200.      } else if (!strcmp(argv[i],"-b")){
  201.        if (argc > i+1){
  202.      i++;
  203.      sscanf(argv[i],"%d",&bgcolor);
  204.        }
  205.      } else  {
  206.     strupr(argv[i]);
  207.     strcpy(filenamewild,argv[i]);
  208.  
  209.     fnsplit(filenamewild,drive,dir,NULL,ext);
  210.     if (*ext=='\0') strcat(filenamewild,SRC_EXT);
  211.  
  212.     if(findfirst(filenamewild,&ffb,0)){
  213.       x_text_mode();
  214.       printf("No files found.\n");
  215.       exit(1);
  216.     }
  217.  
  218.  
  219.     do {
  220.       x_rect_fill(0,0,319,199,0,bgcolor);
  221.       fnsplit(ffb.ff_name,NULL,NULL,name,ext);
  222.       fnmerge(filenamein,drive,dir,name,ext);
  223.       x_printf(0,0,0,20,"%s",filenamein);
  224.       drawfile(filenamein,ext);
  225.       x_printf(0,190,0,20,"Press a key");
  226.       getch();
  227.     } while(!findnext(&ffb));
  228.       }
  229.    x_text_mode();
  230. }